package com.zf.mall.user.service.ser.impl;

import org.springframework.beans.factory.annotation.Autowired;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zf.mall.common.util.IDUtils;
import com.zf.mall.user.service.ser.BaseService;

/**
 * 该类用于扩展自己的公共查询方法和数据库操作<BR/>
 * M: 生成的实体对象的MAPPER接口，在本系统中这个类是代码工具生成，无需手写，可以完成绝大多数单表查询，位于ds 模块中<BR/>
 * T: 生成的库表对应的实体对象类型， 例如 : User , 这个类也是代码工具生成的，位于ds 模块中 <BR/>
 * C: 这个参数代表自定义的mapper接口,代码工具生成的MAPPER无法满足你的查询需求，可自己手写MAPPER查询，MAPPER接口位置ds 模块中 custommapper包中,
 * 在子类中可通过 getCustomMapper()获取到该MAPPER，调用自己写的查询方法<BR/>
 * 注意：该实体对象不需要手工写自定义查询,这个C 类可以传入 和M一样的MAPPER类。<BR/>
 * @author zyf
 */
public class BaseServiceImpl<M extends BaseMapper<T>, T, C> extends  ServiceImpl<M, T> implements BaseService<T> {

	@Autowired
	C customMapper;
	
	@Autowired
	IDUtils idut;
	
	C getCustomMapper() {
		return customMapper;
	}
	
	/***
	 * 生成全局唯一ID，利用雪花算法，(依赖系统时间，不依赖库) 需要注意时间回拨情况，保证服务器时间不能回滚的情况下，可以高性能生产全局唯一ID
	 * @return
	 */
	Long ID() {
		return idut.snowflakeId();
	}
	
	/***
	 * 生成全局唯一ID，利用雪花算法，时间回拨情况,加两个参数是为了在集群部署多套ID生成服务的时候，表识某个服务的唯一 (这两个标识在 数据的第三段，共10位，每个分别占五位)
	 * @param workerId 客户端ID 	(0-31)
	 * @param datacenterId 数据中心ID (0-31)
	 * @return
	 */
	Long ID(long workerId, long datacenterId) {
		return idut.snowflakeId(workerId,datacenterId);
	}
}
